<?php

/**
 * Config_ConfigObject - Objet de configuration propre à chaque utilisateur
 *
 * @package
 * @author Alexis Eric, 
 * Erra Prod. http://www.erraprod.com
 * @copyright Copyright (c) 2012 - Erra Prod
 * @access public
 */
class Config_ConfigObject extends Erra_Fields_Base_Object {

    public static $_configObject = null;

    function __construct($objectId, $buildArgs = null) {
        parent::__construct($objectId, $buildArgs);
       
        $jours_a_afficher = Erra_Fields_ComboBox::create('jours_a_afficher')
                ->addAttribute('class', 'pointer live-change')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDescription('Jours à afficher')
                ->setDatabaseType('TINYINT')
                ->fill(array(1 => '1 jour', 2 => '2 jours', 3 => '3 jours', 4 => '4 jours',
            5 => '5 jours', 6 => '6 jours', 7 => '7 jours', 8 => '8 jours', 9 => '9 jours',
            10 => '10 jours', 11 => '11 jours', 12 => '12 jours', 13 => '13 jours', 14 => '14 jours'));

        // Make the 24h spin
        $heures = array();
        for ($i = 0; $i < 24; $i++) {
            $txtVal = (strlen($i) == 1) ? '0' . $i : $i;
            $heures[$i] = $txtVal . ' h';
        }

        $heure_de_debut = Erra_Fields_ComboBox::create('heure_de_debut')
                ->addAttribute('class', 'pointer live-change calendar-config-hour')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDescription('Heure de début')
                ->setDatabaseType('TINYINT')
                ->fill($heures);

        $heure_de_fin = Erra_Fields_ComboBox::create('heure_de_fin')
                ->addAttribute('class', 'pointer live-change calendar-config-hour')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDescription('Heure de fin')
                ->setDatabaseType('TINYINT')
                ->fill($heures);

        $duree_intervalles = array(12 => '5 minutes', 6 => '10 minutes', 4 => '15 minutes', 3 => '20 minutes', 2 => '30 minutes', 1 => '1 heure');
        $intervalles = Erra_Fields_ComboBox::create('nb_intervalles_par_heure')
                ->addAttribute('class', 'pointer live-change')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDescription('Durée des intervalles')
                ->setDatabaseType('TINYINT')
                ->fill($duree_intervalles);

        $jours = array('today' => "Aujourd'hui", 'monday' => 'Lundi', 'tuesday' => 'Mardi', 'wednesday' => 'Mercredi', 'thursday' => 'Jeudi', 'friday' => 'Vendredi', 'saturday' => 'Samedi', 'sunday' => 'Dimanche');
        $jour_de_demarrage = Erra_Fields_ComboBox::create('jour_de_demarrage')
                ->addAttribute('class', 'pointer live-change')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDescription('Jour de démarrage')
                ->setDatabaseType('CHAR', 16)
                ->fill($jours);

        $date_de_depart = Erra_Fields_Date::create('date_de_depart')
                ->addAttribute('class', 'pointer live-change calendar-config-date')
                ->addAttribute('data-function', 'ajax_config_element')
                ->setDatabaseType("none")
                ->setDescription('Date de départ');


        $agendaArray = Msa_AgendaObject::getAuthorizedAgendaTree();
        $afficher_agendas = Erra_Fields_Tree::create('afficher_agendas')
                ->setDescription('Agendas affichés')
                ->setDatabaseType('TEXT')
                ->fill($agendaArray);

        $google_agenda_id = Erra_Fields_Text::create('google_agenda_id')
                ->setDatabaseType('VARCHAR', 256)
                ->setDescription("Identifiant (optionnel) de l'agenda");

        $login_google = Erra_Fields_Text::create('login_google')
                ->setDatabaseType('VARCHAR', 256)
                ->setDescription('Identifiant ou adresse mail Google');

        $pwd_google = Erra_Fields_Password::create('pwd_google')
                ->setDatabaseType('VARCHAR', 256)
                ->setDescription('Mot de passe Google');


        $agendaListArray = Msa_AgendaObject::getAuthorizedAgendaList();
        $agenda_google = Erra_Fields_ComboBox::create('agenda_google')
                ->setDatabaseType('VARCHAR', 32)
                ->setDescription('Agenda à synchroniser')
                ->fill($agendaListArray);

        $user_id = Erra_Fields_Hidden::create('user_id');

        $this->addFields($user_id, $jours_a_afficher, $heure_de_debut, $heure_de_fin, $intervalles, $jour_de_demarrage, $date_de_depart, $afficher_agendas, $login_google, $pwd_google, $agenda_google, $google_agenda_id);
        // DEBUG_ON - Desynchronisé de la base en raison du nombre important de colonnes à vérifier:
        $this->setSynchronized(false);
        // END_DEBUG
    }

    /**
     * loadConfiguration() - Chargement de l'objet de configuration à partir de la base de donnée
     * Si ce n'est pas possible, un objet est créé pour cet utilisateur avec les valeurs par défaut
     * 
     * @param type $user_id
     * @return type
     */
    public static function loadConfiguration($user_id = null) {
        $user_id = is_numeric($user_id) ? $user_id : Access_ControlObject::get_user_id();
        $configObject = self::$_configObject;
        if (is_null($configObject)) {
            $configObject = Config_ConfigObject::getObject('config_object', 'SQL|CREATE', 'WHERE user_id=' . $user_id);
            if ($configObject->user_id->value == null) {
                // Configure object by default
                $configObject->user_id->setValue($user_id);
                $configObject->nb_intervalles_par_heure->setValue(4);
                $configObject->jour_de_demarrage->setValue('today');
                $configObject->jours_a_afficher->setValue(5);
                $configObject->heure_de_debut->setValue(9);
                $configObject->heure_de_fin->setValue(17);
                Erra_Persistance_PersistanceUnit::saveField($configObject);
            }
            self::$_configObject = $configObject;
        }
        return self::$_configObject;
    }

    /**
     * get() - Retourne un clé de l'objet de configuration
     * 
     * @param type $key - The configuration key
     * @return type
     */
    public static function get($key) {
        $configObject = self::loadConfiguration();
        $return = '';
        if (is_object($configObject) && is_object($configObject->$key)) {
            $return = $configObject->$key->getValue();
        }
        // We can execute here an extra function (same name as parameter) if database value needs processing before usage
        if (method_exists('Config_ConfigObject', $key)) {
            return Config_ConfigObject::$key($return);
        }
        return $return;
    }

    /**
     * ajaxConfig() - Active l'edition des options de configuration via AJAX
     * 
     * @param type $item_key The configuration key
     * @return type
     */
    public static function ajaxConfig($item_key) {
        $configObject = self::loadConfiguration();
        $item_key_function = $item_key . '_';
        if (method_exists('Config_ConfigObject', $item_key_function)) {
            Config_ConfigObject::$item_key_function();
        }
        $extraProperties = array();
        if ($item_key == 'date_de_depart') {
            $extraProperties['size'] = 10;
        }
        if (is_object($configObject) && is_object($configObject->$item_key)) {
            return $configObject->$item_key->editInstance($extraProperties);
        }
    }

    /////////////////////////////////////////
    // FONCTIONS PERSONNALISEES
    // Si une valeur de configuration doit être traitée avec d'être renvoyée, vous pouvez créér
    // une fonction homonyme qui sera executée dans get($key) et qui transformera cette valeur
    /////////////////////////////////////////

    /**
     * jour_de_demarrage() - On souhaite convertir get('jour_de_demarrage') en timestamp 
     * $value est la valeur normalement retournée par la fonction get($key)
     * 
     * @param type $value
     * @return type
     */
    public static function jour_de_demarrage($value) {
        $result = strtotime('today');

        if ($value == 'today' || $value == strtolower(date('l'))) {
            $result = strtotime('today');
        } else {
            $result = strtotime('last ' . $value);
        }

        return $result * 1000; // * 1000 pour convertir en valeur javascript
    }

}
